/**
 * 数据本地持久化
 */

import React from 'react';
import {View, Text, TouchableOpacity, StyleSheet} from 'react-native';

class StorageScreen extends React.Component {
  static navigationOptions = {
    title: 'Storage',
  };

  constructor() {
    super();

    this.state = {
      user: {
        from: '',
        userid: '',
        token: '',
      },
      isLogin: false,
    };
  }

  // 使用key来保存数据（key-only）。这些数据一般是全局独有的，需要谨慎单独处理的数据
  // 批量数据请使用key和id来保存(key-id)，具体请往后看
  // 除非你手动移除，这些数据会被永久保存，而且默认不会过期。
  _save_key() {
    storage.save({
      key: 'loginState', // 注意：请不要在key中使用“_”下划线符号！！！
      id: 'xwg',
      data: {
        from: 'some other site',
        userid: 'some userid',
        token: 'some token',
      },

      // 如果不指定过期时间，则会使用defaultExpires参数
      // 如果设为null，则永不过期
      expires: 1000 * 6,
    });
  }

  // 读取
  _load_key() {
    storage.load({
      key: 'loginState',

      // autoSync(默认为true)意味着在没有找到数据或数据过期时自动调用相应的sync方法
      autoSync: true,

      // syncInBackground(默认为true)意味着如果数据过期，
      // 在调用sync方法的同时先返回已经过期的数据。
      // 设置为false的话，则等待sync方法提供的最新数据(当然会需要更多时间)
      syncInBackground: true,

      syncParams: {
        extraFetchOptions: {
          // 各种参数
        },
        someFlag: true,
      },
    }).then(rst => {
      // 如果找到数据，则在then方法中返回
      // 注意：这是异步返回的结果（不了解异步请自行搜索学习）
      // 你只能在then这个方法内继续处理ret数据
      // 而不能在then以外处理
      // 也没有办法“变成”同步返回
      // 你也可以使用“看似”同步的async/await语法

      console.warn(rst.userid);
      this.setState({ user: rst });
    }).catch(err => {
      //如果没有找到数据且没有sync方法，
      //或者有其他异常，则在catch中返回

      console.warn(err.message);
      switch (err.name) {
        case 'NotFoundError':
          // TODO;
          break;
        case 'ExpiredError':
          // TODO;
          break;
      }
    });
  }

  _save_key_id() {
    let userA = {
      name: '张小三',
      age: 20,
      tags: ['geek', 'nerd', 'otaku'],
    };

    storage.save({
      key: 'user',  // 注意:请不要在key中使用“_”下划线符号！！！
      id: '1001',   // 注意:请不要在id中使用“_”下划线符号！！！
      data: userA,
      expires: 1000 * 6,
    });
  }

  _load_key_id() {
    storage.load({
      key: 'user',
      id: '1001',
      syncInBackground: false,
    }).then(rst => {
      // 如果找到数据，则在then方法中返回
      console.warn('成功 => 姓名：' + rst.name);
    }).catch(err => {
      //如果没有找到数据且没有sync方法，
      //或者有其他异常，则在catch中返回

      console.warn(err.message);
      switch (err.name) {
        case 'NotFoundError':
          // TODO;
          break;
        case 'ExpiredError':
          // TODO;
          break;
      }
    });
  }

  _isLogin() {
    storage.load({
      key: 'isLogin',
    }).then(isLogin => {
      this.setState({isLogin: isLogin});
    }).catch(err => {
      alert(err.message);
    });
  }

  render() {
    return (
      <View style={styles.container}>
        <Text>我来说明一下，这里是用来测试保存、读取和删除数据的</Text>

        <TouchableOpacity style={styles.button} activeOpacity={0.5} onPress={() => this._save_key()}>
          <Text>使用key来保存数据（key-only）</Text>
        </TouchableOpacity>

        <TouchableOpacity style={styles.button} activeOpacity={0.5} onPress={() => this._load_key()}>
          <Text>load_key</Text>
        </TouchableOpacity>

        <TouchableOpacity style={styles.button} activeOpacity={0.5} onPress={() => this._save_key_id()}>
          <Text>使用key和id来保存数据</Text>
        </TouchableOpacity>

        <TouchableOpacity style={styles.button} activeOpacity={0.5} onPress={() => this._load_key_id()}>
          <Text>load_key_id</Text>
        </TouchableOpacity>

        <TouchableOpacity
          style={styles.button}
          activeOpacity={0.5}
          onPress={ () => {
            storage
              .getIdsForKey('user')
              .then(ids => {
                console.warn(ids);
              })
          }}>
          <Text>获取某个key下的所有id(仅key-id数据)</Text>
        </TouchableOpacity>

        <TouchableOpacity
          style={styles.button}
          activeOpacity={0.5}
          onPress={ () => {
            storage
              .getAllDataForKey('user')
              .then(users => {
                console.warn(JSON.stringify(users));
              })
          }}>
          <Text>获取某个key下的所有数据(仅key-id数据)</Text>
        </TouchableOpacity>

        <TouchableOpacity
          style={styles.button}
          activeOpacity={0.5}
          onPress={ () => {
            storage.clearMapForKey('user');
          }}>
          <Text>!! 清除某个key下的所有数据(仅key-id数据)</Text>
        </TouchableOpacity>

        <TouchableOpacity
          style={styles.button}
          activeOpacity={0.5}
          onPress={ () => {
            storage.remove({ key: 'loginState' });
            storage.remove({ key: 'user', id: '1001'})

          }}>
          <Text>删除单个数据</Text>
        </TouchableOpacity>

        <TouchableOpacity
          style={styles.button}
          activeOpacity={0.5}
          onPress={ () => {
            storage.clearMap();
          }}>
          <Text>!! 清空map，移除所有"key-id"数据（但会保留只有key的数据）</Text>
        </TouchableOpacity>

        <TouchableOpacity
          style={styles.button}
          activeOpacity={0.5}
          onPress={ () => {
            this._isLogin();
          }}>
          <Text>登录状态：{this.state.isLogin ? '已登录' : '未登录'}</Text>
        </TouchableOpacity>

      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
    backgroundColor: 'white',
  },
  button: {
    marginTop: 30,
    padding: 5,
    borderWidth: 1,
    borderRadius: 5,
    borderColor: 'orange',
    alignItems: 'center',
    justifyContent: 'center',
  }
});

export default StorageScreen;